<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // let 块级作用域
        if (1) {
            // 大括号中就是块级作用域
        }
        // 1.同一变量在相同作用域下不能重复声明
        let a = 1;
        // let a = 2;

        //Uncaught SyntaxError: Identifier 'a' has already been declared
        //形参中声明，不能重复定义
        function tes(a) {
            // let a = 1;
            console.log(a);
        }
        tes()
            // 2。 let不会声明提升，会产生一个暂时性死区

        //01块级作用域与嵌套、let暂行性死区
        // .html:29 Uncaught ReferenceError: Cannot access 'b' before initialization
        // 同一作用域下，未声明前使用该变量会报错，
        // console.log(b);
        // 3.let只能在当前作用域下生效
        let b = 1

        // let本质上就是为js增加了一个块级作用域
        // 不建议在块级作用域中，使用函数声明的方式 声明函数，而用函数表达式的方式
        // 块级作用域是没有返回值的


        //打印十个a
        for (let i = 0; i < 10; i++) {
            let i = 'a';
            console.log(i)
        }
        // 报错
        // for (let i = 0; i < 10; i++) {
        //     var i = 'a';
        //     console.log(i)
        // }
        // 打印一个a
        for (let i = 0; i < 10; i++) {
            i = 'a';
            console.log(i)
        } {
            let i = 0; {
                //产生一个新的作用域的i
                let i = 'a';
                // 变量提升，导致报错，i变量只能声明一次
                // var i = 'a';
                // 对外层作用域的i重新赋值
                // i = 'a';
            }
        }



        // const 常量必须赋值,一旦赋值不能更改.
        // 不能提升,存在暂存性死区
        // 有块级作用域
        const ab = 1;
        console.log(ab);
        // const声明对象后,依然可以添加属性 
        const obj = {};
        // 使用Object.freeze冻结对象
        // Object.freeze(obj)
        obj.name = '小红'
        console.log(obj);

        function myFreeze(obj) {
            Object.freeze(obj);
            for (var key in obj) {
                if (typeof(obj[key] === 'object') && obj[key] !== null) {
                    Object.freeze(obj[key])
                }
            }
        }
    </script>
</body>

</html>